package cn.com.liu.d_processVariables;

import java.io.InputStream;
import java.util.Date;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.junit.Test;

public class ProcessVariables {
	ProcessEngine processEngine=ProcessEngines.getDefaultProcessEngine();
	/**部署流程定义*/
	@Test
	public void deploymentProcessDefinition_inputStream(){
		InputStream inputStreamBpmn=this.getClass().getResourceAsStream("/diagrams/processVariables.bpmn");
		InputStream inputStreamPng=this.getClass().getResourceAsStream("/diagrams/processVariables.png");
		Deployment deployment=processEngine.getRepositoryService()//与流程定义和部署相关的service
		.createDeployment()//创建一个部署对象
		.name("流程定义")
		.addInputStream("processVariables.bpmn", inputStreamBpmn)//使用资源文件的名称（要求:与资源文件的名称要一致）和输入流完成部署
		.addInputStream("processVariables.png", inputStreamPng)//使用资源文件的名称（要求:与资源文件的名称要一致）和输入流完成部署
		.deploy();//完成部署
		
		System.out.println("部署ID："+deployment.getId());
		System.out.println("部署名称："+deployment.getName());
	}
	
	/**启动流程实例*/
	@Test
	public void startProcessInstance(){
		String processDefinitionKey="processVariables";
		ProcessInstance pi=processEngine.getRuntimeService()//与正在执行的流程实例和执行对象相关的service
		.startProcessInstanceByKey(processDefinitionKey);//使用流程定义的key启动流程实例，key对应helloworld.bpmn文件中id的属性值，使用key值启动，默认是按照最新版本的流程定义启动
	System.out.println("流程实例ID："+pi.getId());
	System.out.println("流程定义ID："+pi.getProcessDefinitionId());
	}
	
	/**
	 * 设置流程变量
	 */
	@Test
	public void setVariables(){
		TaskService taskService=processEngine.getTaskService();
		//RuntimeService runtimeService=processEngine.getRuntimeService();
		//任务id
		String taskId="2404";
		//String executionId="2401";
		/**一：设置流程变量，使用基本数据类型*/
//		taskService.setVariableLocal(taskId, "请假天数", 8);//与任务id绑定
//		taskService.setVariable(taskId, "请假时间", new Date());
//		taskService.setVariable(taskId, "请假原因", "回家探亲");
		/**二：设置流程变量，使用javabean类型（javabean必须实现序列化）*/
		/**
		 * 当一个javabean（实现序列化的）放置到流程变量中，要求javabean的属性不能再发生变化
		 * 如果发生变化，再获取的时候会抛出异常
		 */
		Person p=new Person();
		p.setId(12);
		p.setName("玛丽2");
		taskService.setVariable(taskId, "人员信息(uid)", p);
		//runtimeService.setVariableLocal(executionId, "请假天数", 9);
		System.out.println("流程变量设置成功");
	}
	
	/**
	 * 获取流程变量
	 */
	@Test
	public void getVariables(){
		TaskService taskService=processEngine.getTaskService();
		//任务id
		String taskId="2404";
		/**一：获取流程变量，使用基本数据类型*/
//		Integer days=(Integer)taskService.getVariable(taskId, "请假天数");
//		Date date=(Date)taskService.getVariable(taskId, "请假时间");
//		String reason=(String)taskService.getVariable(taskId, "请假原因");
//		System.out.println("请假天数:"+days);
//		System.out.println("请假时间:"+date);
//		System.out.println("请假原因:"+reason);
		/**二：获取流程变量，使用javabean类型*/
		Person p=(Person)taskService.getVariable(taskId, "人员信息(uid)");
		System.out.println(p.getId()+"         "+p.getName());
	}
	
	/**完成我的任务*/
	@Test
	public void completeMyPersonTask(){
		String taskId="4402";
		processEngine.getTaskService()//与正在执行的任务相关的service
		.complete(taskId);
		System.out.println("完成任务，任务ID："+taskId);
	}
}
